package com.zj.leetcode.easy.hash;

import java.util.HashMap;
import java.util.Objects;

/**
 * @program: algorithm
 * @description:
 * 同构字符串
 * 205 isomorphic-strings
 * @author: Zhang Bo
 * @create: 2022-01-14 17:05
 **/
public class IsomorphicStrings{
    public static void main(String[] args) {
//        String s = "egg", t = "add";
        String s = "foo", t = "bar";
        Solution solution = new IsomorphicStrings().new Solution();
        System.out.println(solution.isIsomorphic(s, t));
    }
    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        /**
         * 这个思想就是，只要保证和他相同的元素的上一个元素相同就可以了
         * 检验上一次该元素出现的位置不同，则不是同构字
         *
         * put 如果有值，则返回之前的值；
         * 如果没有，则返回null
         * @param s
         * @param t
         * @return
         */
        public boolean isIsomorphic(String s, String t) {

            if(s.length() != t.length()){
                return false;
            }

            HashMap<Character, Integer> sMap = new HashMap<>();
            HashMap<Character, Integer> tMap = new HashMap<>();
            for (int i = 0; i < s.length(); i++) {
                if(!Objects.equals(sMap.put(s.charAt(i), i), tMap.put(t.charAt(i), i))){
                    return false;
                }
            }
            return true;

        }

        /**
         * 两个当前字符的首次出现索引不相同，就说明非双射。
         * 代码很简洁。
         * @param s
         * @param t
         * @return
         */
        public boolean isIsomorphic02(String s, String t) {
            for(int i = 0; i < s.length(); i++){
                if(s.indexOf(s.charAt(i)) != t.indexOf(t.charAt(i))){
                    return false;
                }
            }
            return true;
        }

        /**
         * 抄一遍吧
         * @param s
         * @param t
         * @return
         */
        public boolean isIsomorphic03(String s, String t) {
            if(s.length() != t.length()){
                return false;
            }
            for (int i = 0; i < s.length(); i++) {
                if(s.indexOf(s.charAt(i)) != t.indexOf(t.charAt(i))){
                    return false;
                }
            }
            return true;
        }

    }
//leetcode submit region end(Prohibit modification and deletion)

}